package com.rayframework.context.support;


import com.rayframework.beans.factory.support.BeanDefinitionReader;
import com.rayframework.beans.factory.support.BeanDefinitionRegistry;
import com.rayframework.context.ApplicationContext;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 定义非延时加载功能 - {@link ApplicationContext}的子实现类 - 用于立即加载
 * 创建容器对象的时候就加载配置文件，并对Bean对象初始化，存储在容器里
 * -作为ApplicationContext接口的子类，所以该类也是非延时加载，所以需要在该类中定义一个Map集合，作为bean对象存储的容器。
 * -声明BeanDefinitionReader类型的变量，用来进行xml配置文件的解析，符合单一职责原则。
 *
 *
 * @author LiaoYuXing-Ray
 * @version 1.0
 * @createDate 2023/11/24 11:42
 **/
public abstract class AbstractApplicationContext implements ApplicationContext {

    /**
     * 声明解析器变量 2023/11/24 16:57
     */
    protected BeanDefinitionReader beanDefinitionReader;

    /**
     * 定义用于存储bean对象的map容器 2023/11/24 16:57
     */
    protected Map<String, Object> singletonObjects = new ConcurrentHashMap<>();

    /**
     * 声明配置文件路径的变量 2023/11/24 16:57
     */
    protected String configLocation;

    @Override
    public void refresh() throws Exception {
        // 加载BeanDefinition对象
        beanDefinitionReader.loadBeanDefinitions(configLocation);
        // 初始化bean
        finishBeanInitialization();
    }


    /**
     * bean的初始化 2023/11/24 16:57
     */
    private void finishBeanInitialization() throws Exception {
        // 获取注册表对象
        BeanDefinitionRegistry registry = beanDefinitionReader.getRegistry();

        // 获取BeanDefinition对象
        String[] beanNames = registry.getBeanDefinitionNames();
        for (String beanName : beanNames) {
            // 进行bean的初始化 使用到了模板方法模式
            getBean(beanName);
        }
    }
}
